iT邦幫忙

2024 iThome 鐵人賽

DAY 10
0
Software Development

從身邊神人大大身上學到的那些事系列 第 10

Use-the-index-luke 讀後筆記-5(Clustering Data)

  • 分享至 

  • xImage
  •  

接下來想要介紹的是index的其他用法
對於資料庫來說,index就是將原本資料表中的某些欄位排序的內容
所以這些index如果搜尋的欄位都有的狀況下,也能提升某種程度的效率
附上文章內的圖片

intentional-filter-predicate

在這張圖中可以看到,如果我只針對第一個欄位增加index,那第二個條件的like在比對的時候,每一筆資料我都要花一個random io來把原本的資料讀出來比對
但如果我同時建立了兩個index,此時,我在取得index的時候就可以同時比對第二個條件是否有符合,如果符合再依照row_id把完整的資料取出
這樣就大大的減少了random io的存取,進而增加了尋找的效率

另外,如果僅搜尋index的欄位的並且在回傳的時候也只回傳index的欄位時,也可以加速
這個情境比較常使用到一個index有兩個以上欄位的時候使用
user裡面有九筆資料

id phone name
5 0908070605 user5
1 0912333555 user1
3 0912345678 user3
6 0912999888 user6
7 0922111333 user7
8 0933444555 user8
9 0944555666 user9
10 0955666777 user10
11 0966777888 user11

Index1裡面會是

phone diskAddress name
0908070605 0x13579 user5
0912333555 0x12345 user1
0912345678 0x56789 user3
0912999888 0x11111 user6
0922111333 0x22222 user7
0933444555 0x33333 user8
0944555666 0x44444 user9
0955666777 0x55555 user10
0966777888 0x66666 user11

此時如果query的語法是

select name, phone from user where phone like '091%';

這時候資料庫在找資料時,就只要找完index後,直接將index的內容直接回傳,就不用再到另一個硬碟的空間,把整列user的資料讀出來

這個尤其在資料表有超級多欄位的時候特別好用,因為這樣就可以減少大量的硬讀random io的讀取次數

Ref
https://use-the-index-luke.com/sql/clustering/index-filter-predicates


上一篇
番外篇-工程師為什麼要學習這麼多的知識
下一篇
Use-the-index-luke 讀後筆記-6(order by / pagination)
系列文
從身邊神人大大身上學到的那些事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言